package com.gitee.chili.leisure.core;

import com.gitee.chili.leisure.game.Player;
import com.gitee.chili.leisure.game.RoomDetail;

import java.util.Collections;
import java.util.List;
import java.util.Random;

/**
 * GameTemplate
 *
 * @author week solider
 * @since 2020.09.17
 */
public interface GameTemplate {

    /**
     * 洗牌
     * JDK原生混洗算法 {@link Collections#shuffle(List, Random)}
     *
     * @param count 洗牌的次数
     * @see Collections
     */
    void shuffle(int count, List<Integer> cards, RoomDetail roomDetail);

    /**
     * 发牌
     * <p>
     * 玩家类型必须是相同类型的否则可能产生一些不可预知的情况
     * 这里引用的是一个基类{@link com.gitee.chili.leisure.game.Player} 当你需要自定义一个
     * 玩家类时，请注意基类中的说明
     *
     * @param cards      牌张
     * @param players    玩家
     * @param roomDetail 房间详情
     */
    void deal(List<Integer> cards, List<? extends Player> players, RoomDetail roomDetail);

    /**
     * 对玩家的手牌进行排序
     * 麻将一般按照： 万、条、筒的顺序
     * 扑克一般按照： 3 ~ 2 的顺序，花色：黑、红、梅、方
     */
    void sort(List<? extends Player> players);

    /**
     * 当选庄方式为默认：
     * 指定默认那张牌被发到给玩家时，被选举为拥有叫庄的能力，
     * 麻将的情况下直接可以优先出牌 如没有指定牌张，系统默认
     * 采用 {@code A} 来判断
     * <p>
     * 当选庄方式为随机：
     * 将在玩家最大个数中随机挑选
     * <p>
     * 当选庄方式为指定：
     * 麻将有： 东(1) 南(2) 西(3) 北(4) ，纸牌有： 1、2、3
     *
     * @param players 选庄的方式
     */
    void election(List<? extends Player> players);
}
